﻿using Microsoft.CodeAnalysis;
using Sys.Workflow.Bpmn.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sys.Workflow.Engine.impl.runtime
{
    /* Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */

    /**
     * @author Tijs Rademakers
     */
    public class MoveActivityIdContainer
    {

        protected List<string> activityIds;
        protected List<string> moveToActivityIds;
        protected bool moveToParentProcess;
        protected bool moveToSubProcessInstance;
        protected string callActivityId;
        protected long callActivitySubProcessVersion;
        protected string newAssigneeId;
        protected string newOwnerId;

        public MoveActivityIdContainer(string singleActivityId, string moveToActivityId)
        {
            this.activityIds = new List<string>() { singleActivityId };
            this.moveToActivityIds = new List<string>() { moveToActivityId };
            this.newAssigneeId = null;
            this.newOwnerId = null;
        }

        public MoveActivityIdContainer(string singleActivityId, string moveToActivityId, string newAssigneeId, string newOwnerId)
        {
            this.activityIds = new List<string>() { singleActivityId };
            this.moveToActivityIds = new List<string>() { moveToActivityId };
            this.newAssigneeId = newAssigneeId;
            this.newOwnerId = newOwnerId;
        }

        public MoveActivityIdContainer(List<string> activityIds, string moveToActivityId)
        {
            this.activityIds = activityIds;
            this.moveToActivityIds = new List<string>() { moveToActivityId };
            this.newAssigneeId = null;
            this.newOwnerId = null;
        }

        public MoveActivityIdContainer(List<string> activityIds, string moveToActivityId, string newAssigneeId, string newOwnerId)
        {
            this.activityIds = activityIds;
            this.moveToActivityIds = new List<string>() { moveToActivityId };
            this.newAssigneeId = newAssigneeId;
            this.newOwnerId = newOwnerId;
        }

        public MoveActivityIdContainer(string singleActivityId, List<string> moveToActivityIds)
        {
            this.activityIds = new List<string>() { singleActivityId };
            this.moveToActivityIds = moveToActivityIds;
            this.newAssigneeId = null;
            this.newOwnerId = null;
        }

        public MoveActivityIdContainer(string singleActivityId, List<string> moveToActivityIds, string newAssigneeId, string newOwnerId)
        {
            this.activityIds = new List<string>() { singleActivityId };
            this.moveToActivityIds = moveToActivityIds;
            this.newAssigneeId = newAssigneeId;
            this.newOwnerId = newOwnerId;
        }

        public List<string> GetActivityIds()
        {
            return activityIds ?? new List<string>();
        }

        public List<string> GetMoveToActivityIds()
        {
            return moveToActivityIds ?? new List<string>();
        }

        public bool IsMoveToParentProcess()
        {
            return moveToParentProcess;
        }

        public void SetMoveToParentProcess(bool moveToParentProcess)
        {
            this.moveToParentProcess = moveToParentProcess;
        }

        public bool IsMoveToSubProcessInstance()
        {
            return moveToSubProcessInstance;
        }

        public void SetMoveToSubProcessInstance(bool moveToSubProcessInstance)
        {
            this.moveToSubProcessInstance = moveToSubProcessInstance;
        }

        public string GetCallActivityId()
        {
            return callActivityId;
        }

        public void SetCallActivityId(string callActivityId)
        {
            this.callActivityId = callActivityId;
        }

        public long GetCallActivitySubProcessVersion()
        {
            return callActivitySubProcessVersion;
        }

        public void SetCallActivitySubProcessVersion(long callActivitySubProcessVersion)
        {
            this.callActivitySubProcessVersion = callActivitySubProcessVersion;
        }

        public Optional<string> GetNewAssigneeId()
        {
            return newAssigneeId;
        }

        public Optional<string> GetNewOwnerId()
        {
            return newOwnerId;
        }
    }
}
